/**
 * 
 */
package join.web.controller;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import join.model.beans.CronogramaActividad;
import join.model.beans.Proyecto;
import join.model.beans.TipoProyecto;
import join.model.repositories.CronogramaActividadRepository;
import join.model.repositories.ProyectoRepository;
import join.model.repositories.TipoProyectoRepository;
import join.util.AppListUtil;
import join.util.CodeUtil;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author Cesar Rodriguez
 */

@Controller
@RequestMapping("/proyecto")
public class ProyectoController {
	@Autowired
	ProyectoRepository proyectoRepo;
	
	@Autowired
	CronogramaActividadRepository cronogramaActividadRepository;
	
	@Autowired
	TipoProyectoRepository tipoProyectoRepository;

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView lst(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		List<Proyecto> lp = (List<Proyecto>) proyectoRepo.findAll();

		Map<String, Object> model = new HashMap<String, Object>();
		model.put("list", lp);

		return new ModelAndView("project/proyectoLst", "model", model);
	}

	@RequestMapping(value = "/{id}/load", method = RequestMethod.GET)
	public ModelAndView load(ModelMap model, @PathVariable Long id)
			throws Exception {
		Long esfuerzoEstimado = 0L;
		Long esfuerzoRealizado = 0L;
		
		Proyecto p = proyectoRepo.findOne(id);
		model.put("proyecto", p);
		
		//Calculo del esfuerzo realizado
		if (p.getCronograma()!=null){
			List<CronogramaActividad> lca = cronogramaActividadRepository.findByCronograma(p.getCronograma());
			
			for (CronogramaActividad ca : lca) {
				esfuerzoEstimado += (ca.getEsfuerzoEstimado()!=null?ca.getEsfuerzoEstimado():0L);
				esfuerzoRealizado += (ca.getEsfuerzo()!=null?ca.getEsfuerzo():0L);
			}
		}
		
		model.put("esfuerzoEstimado", esfuerzoEstimado);
		model.put("esfuerzoRealizado", esfuerzoRealizado);
		loadLists(model);
		return new ModelAndView("project/proyectoAdm", "model", model);
	}

	@RequestMapping(value="/preload", method=RequestMethod.GET)
	public ModelAndView preload(ModelMap model){
		Proyecto proyecto = new Proyecto();
		model.put("proyecto", proyecto);
		loadLists(model);
		return new ModelAndView("project/proyectoAdm", "model", model);
	}
	
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public ModelAndView add(@ModelAttribute("proyecto") Proyecto nuevoProyecto,  
			ModelMap model, HttpServletRequest request,
			HttpServletResponse response)
			throws Exception {

		System.out.println(nuevoProyecto);
		//aqui ya se puede guardar el proyecto!!!!!
		
		if (nuevoProyecto.getId()==null){
			nuevoProyecto.setAno(CodeUtil.getCurrentYear());
			nuevoProyecto.setEmpresa(1);
			nuevoProyecto.setDescripcion(nuevoProyecto.getNombre());
			nuevoProyecto.setUsuario("crodriguez");
			nuevoProyecto.setAvanceCosto(new Double(0));
			nuevoProyecto.setAvanceTiempo(new Double(0));
			
			List<Proyecto> lp = proyectoRepo.findByAno(nuevoProyecto.getAno());
			nuevoProyecto.setCodigo(new Long(lp.size()+1));
		}
		
		proyectoRepo.save(nuevoProyecto);

		model.put("proyecto", nuevoProyecto);
		return lst(request, response);
	}
	
	/**
	 * Carga de listados
	 * @param model
	 */
	private void loadLists(Map<String, Object> model){
		model.put("lpFase", AppListUtil.getLista("proyectoFase"));
		model.put("lpEstado", AppListUtil.getLista("proyectoEstado"));
		
		//Lista de tipos de proyecto
		List<TipoProyecto> tipoProyectos = tipoProyectoRepository.findByEstado("A");
		
		Map<String, String> mtp = new LinkedHashMap<String, String>();
		mtp.put("", "");
		
		for (TipoProyecto tp : tipoProyectos) {
			mtp.put(tp.getId().toString(), tp.getNombre());
		}
		
		model.put("lpTipo", mtp);
	}
}